package cn.elwy.rcp.ui.config;

import java.io.File;
import java.io.IOException;

import cn.elwy.common.exception.RunException;
import cn.elwy.common.util.JsonUtil;
import cn.elwy.common.util.io.FileUtil;
import cn.elwy.osgi.config.ConfigContext;
import cn.elwy.osgi.config.ConfigPath;
import cn.elwy.rcp.core.model.ui.DialogInfo;

public class DialogConfigAdapter {

  private static final String DIALOG_CONFIG_EXT_NAME = "dat";

  public DialogInfo getDialogInfo(Object subjectId, String tableId) {
    // 从本地文件加载个人配置信息
    DialogInfo dialogInfo = getDialogInfoByFile(subjectId, tableId);
    if (dialogInfo != null) {
      return dialogInfo;
    }
    // 从服务器加载个人配置信息
    dialogInfo = getDialogInfoByDB(subjectId, tableId);
    if (dialogInfo != null) {
      return dialogInfo;
    }
    // 从本地文件加载全局配置信息
    dialogInfo = getDialogInfoByFile(null, tableId);
    if (dialogInfo != null) {
      return dialogInfo;
    }
    // 从服务器加载全局配置信息
    return getDialogInfoByDB(null, tableId);
  }

  public void saveDialogInfo(Object subjectId, DialogInfo dialogInfo) {
    saveDialogInfoToFile(subjectId, dialogInfo);
    saveDialogInfoToDB(subjectId, dialogInfo);
  }

  protected DialogInfo getDialogInfoByFile(Object subjectId, String tableId) {
    try {
      File file = getFile(subjectId, tableId, DIALOG_CONFIG_EXT_NAME);
      if (!file.exists()) {
        return null;
      }
      String json = FileUtil.readFileToString(file.getAbsolutePath(), "UTF-8");
      return JsonUtil.toObject(json, DialogInfo.class);
    } catch (Exception e) {
      throw new RunException(e.getMessage(), e);
    }
  }

  protected DialogInfo getDialogInfoByDB(Object subjectId, String tableId) {
    return null;
  }

  protected void saveDialogInfoToFile(Object subjectId, DialogInfo dialogInfo) {
    try {
      File file = getFile(subjectId, dialogInfo.getId(), DIALOG_CONFIG_EXT_NAME);
      String json = JsonUtil.toJson(dialogInfo, true);
      FileUtil.writeFileByString(file, json, "UTF-8");
    } catch (IOException e) {
      throw new RunException(e.getMessage(), e);
    }
  }

  protected void saveDialogInfoToDB(Object subjectId, DialogInfo dialogInfo) {
  }

  protected File getFile(Object subjectId, String tableId, String extName) {
    return ConfigPath.getFile(ConfigContext.getDialogConfigDir(), subjectId, tableId, extName);
  }

}
